home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 58 / pcpp58a.iso / extras / quake 3 source / Q3A_ToolSource.exe / Main / md3lib.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-01-02  |  5.0 KB  |  188 lines

  1. #include <assert.h>
  2. #include <io.h>
  3. #include "md3lib.h"
  4.  
  5. /*
  6. ** MD3_ComputeTagFromTri
  7. */
  8. void MD3_ComputeTagFromTri( md3Tag_t *pTag, const float pTri[3][3] )
  9. {
  10.     float    len[3];
  11.     vec3_t    axes[3], sides[3];
  12.     int        longestSide, shortestSide, hypotSide;
  13.     int        origin;
  14.     int        j;
  15.     float    d;
  16.  
  17.     memset( axes, 0, sizeof( axes ) );
  18.     memset( sides, 0, sizeof( sides ) );
  19.  
  20.     //
  21.     // compute sides
  22.     //
  23.     for ( j = 0; j < 3; j++ )
  24.     {
  25.         sides[j][0] = pTri[(j+1)%3][0] - pTri[j][0];
  26.         sides[j][1] = pTri[(j+1)%3][1] - pTri[j][1];
  27.         sides[j][2] = pTri[(j+1)%3][2] - pTri[j][2];
  28.  
  29.         len[j] = ( float ) sqrt( DotProduct( sides[j], sides[j] ) );
  30.     }
  31.  
  32. #if 0
  33.     if ( len[0] > len[1] && len[0] > len[2] )
  34.     {
  35.         longestSide = 0; shortestSide = 1; origin = 2;
  36.     }
  37.     else if ( len[1] > len[0] && len[1] > len[2] )
  38.     {
  39.         longestSide = 1; shortestSide = 2; origin = 0;
  40.     }
  41.     else if ( len[2] > len[0] && len[2] > len[1] )
  42.     {
  43.         longestSide = 2; shortestSide = 0; origin = 1;
  44.     }
  45.     else
  46.     {
  47.         Error( "invalid tag triangle, must be a right triangle with unequal length sides" );
  48.     }
  49. #endif
  50.     if ( len[0] > len[1] && len[0] > len[2] ) {
  51.         hypotSide = 0;
  52.         origin = 2;
  53.     } else if ( len[1] > len[0] && len[1] > len[2] ) {
  54.         hypotSide = 1;
  55.         origin = 0;
  56.     } else if ( len[2] > len[0] && len[2] > len[1] ) {
  57.         hypotSide = 2;
  58.         origin = 1;
  59.     }
  60.     len[hypotSide] = -1;
  61.  
  62.     if ( len[0] > len[1] && len[0] > len[2] ) {
  63.         longestSide = 0;
  64.     } else if ( len[1] > len[0] && len[1] > len[2] ) {
  65.         longestSide = 1;
  66.     } else if ( len[2] > len[0] && len[2] > len[1] ) {
  67.         longestSide = 2;
  68.     }
  69.     len[longestSide] = -1;
  70.  
  71.     if ( len[0] > len[1] && len[0] > len[2] ) {
  72.         shortestSide = 0;
  73.     } else if ( len[1] > len[0] && len[1] > len[2] ) {
  74.         shortestSide = 1;
  75.     } else if ( len[2] > len[0] && len[2] > len[1] ) {
  76.         shortestSide = 2;
  77.     }
  78.     len[shortestSide] = -1;
  79.  
  80.  
  81.  
  82. //    VectorNormalize( sides[shortestSide], axes[0] );
  83. //    VectorNormalize( sides[longestSide], axes[1] );
  84.     VectorNormalize( sides[longestSide], axes[0] );
  85.     VectorNormalize( sides[shortestSide], axes[1] );
  86.  
  87.     // project shortest side so that it is exactly 90 degrees to the longer side
  88.     d = DotProduct( axes[0], axes[1] );
  89.     VectorMA( axes[0], -d, axes[1], axes[0] );
  90.     VectorNormalize( axes[0], axes[0] );
  91.  
  92.     CrossProduct( sides[longestSide], sides[shortestSide], axes[2] );
  93.     VectorNormalize( axes[2], axes[2] );
  94.  
  95.     pTag->origin[0] = pTri[origin][0];
  96.     pTag->origin[1] = pTri[origin][1];
  97.     pTag->origin[2] = pTri[origin][2];
  98.  
  99.     VectorCopy( axes[0], pTag->axis[0] );
  100.     VectorCopy( axes[1], pTag->axis[1] );
  101.     VectorCopy( axes[2], pTag->axis[2] );
  102. }
  103.  
  104. /*
  105. ==============
  106. MD3_Dump
  107. ==============
  108. */
  109. void MD3_Dump( const char *filename )
  110. {
  111.     md3Header_t header;
  112.     md3Tag_t *pTag;
  113.     md3Surface_t *pSurface;
  114.     FILE *fp;
  115.     void *_buffer;
  116.     void *buffer;
  117.     long fileSize;
  118.     int i;
  119.  
  120.     if ( ( fp = fopen( filename, "rb" ) ) == 0 )
  121.     {
  122.         Error( "Unable to open '%s'\n", filename );
  123.     }
  124.  
  125.     fileSize = filelength( fileno( fp ) );
  126.     _buffer = malloc( filelength( fileno( fp ) ) );
  127.     fread( _buffer, fileSize, 1, fp );
  128.     fclose( fp );
  129.  
  130.     buffer = ( char * ) _buffer;
  131.     header = *( md3Header_t * ) _buffer;
  132.  
  133.     if ( header.ident != MD3_IDENT )
  134.     {
  135.         Error( "Incorrect ident for '%s'\n", filename );
  136.     }
  137.  
  138.     printf( "Contents of '%s'\n", filename );
  139.     printf( "  version:        %d\n", header.version );
  140.     printf( "  name:           %s\n", header.name );
  141.     printf( "  num frames:     %d\n", header.numFrames );
  142.     printf( "  num tags:       %d\n", header.numTags );
  143.     printf( "  num surfaces:   %d\n", header.numSurfaces );
  144.     printf( "  num skins:      %d\n", header.numSkins );
  145.     printf( "  file size:      %d\n", fileSize );
  146.  
  147.     printf( "--- TAGS ---\n" );
  148.     pTag = ( md3Tag_t * ) ( ( ( char * ) buffer ) + header.ofsTags );
  149.     for ( i = 0; i < header.numTags; i++, pTag++ )
  150.     {
  151.         printf( "  tag %d ('%s')\n", i, pTag->name );
  152.         printf( "    origin: %f,%f,%f\n", pTag->origin[0], pTag->origin[1], pTag->origin[2] );
  153.         printf( "        vf: %f,%f,%f\n", pTag->axis[0][0], pTag->axis[0][1], pTag->axis[0][2] );
  154.         printf( "        vr: %f,%f,%f\n", pTag->axis[1][0], pTag->axis[1][1], pTag->axis[1][2] );
  155.         printf( "        vu: %f,%f,%f\n", pTag->axis[2][0], pTag->axis[2][1], pTag->axis[2][2] );
  156.     }
  157.  
  158.     printf( "--- SURFACES ---\n" );
  159.     pSurface = ( md3Surface_t * ) ( ( ( char * ) buffer ) + header.ofsSurfaces );
  160.  
  161.     for ( i = 0; i < header.numSurfaces; i++ )
  162.     {
  163.         int j;
  164.  
  165.         md3Shader_t *pShader = ( md3Shader_t * ) ( ( ( char * ) pSurface ) + pSurface->ofsShaders );
  166.  
  167.         printf( "\n  surface %d ('%s')\n", i, pSurface->name );
  168.         printf( "    num frames: %d\n", pSurface->numFrames );
  169.         printf( "    num shaders: %d\n", pSurface->numShaders );
  170.         printf( "    num tris: %d\n", pSurface->numTriangles );
  171.         printf( "    num verts: %d\n", pSurface->numVerts );
  172.  
  173.         if ( pSurface->numShaders > 0 )
  174.         {
  175.             printf( "    --- SHADERS ---\n" );
  176.  
  177.             for ( j = 0; j < pSurface->numShaders; j++, pShader++ )
  178.             {
  179.                 printf( "    shader %d ('%s')\n", j, pShader->name );
  180.             }
  181.         }
  182.         pSurface = ( md3Surface_t * ) ( ( ( char * ) pSurface ) + pSurface->ofsEnd );
  183.     }
  184.  
  185.     free( _buffer );
  186. }
  187.  
  188.